local utils = {}

local lbsLoc2 = require("lbsLoc2")
-- local config_download_url = "http://download.eomni.cn"
local config_download_url = "http://121.36.219.151:8001/"
local config_file_name = "/config.json"
local gps_file_name = "/gps.json"

_G.mqtt_config = {}
_G.threshold = {}
_G.interval = {}

function utils.isFirstBoot()
    local reason, slp_state = pm.lastReson() -- 获取唤醒原因
    log.info("wakeup state", pm.lastReson())
    if slp_state > 0 then  --唤醒时，退出飞行模式
        mobile.flymode(0, false) -- 退出飞行模式，进入psm+前进入飞行模式，唤醒后需要主动退出
    end
    return slp_state == 0
end

-- 初始化4G，并读取
function init()
    gpio.setup(20, nil, gpio.PULLUP) -- 开机时，压力传感器供电
    sys.waitUntil("IP_READY")
    sys.wait(5000)
end

-- 读取经度和纬度
function utils._getRealLatLng()
    mobile.reqCellInfo(15)--进行基站扫描
    sys.waitUntil("CELL_INFO_UPDATE", 3000)
    local lat, lng, t = lbsLoc2.request(5000)
    log.info("获取实时数据lat,lng", lat, lng)
    -- 写入文件 gps.json
    gps = {lat=lat, lng=lng}
    io.writeFile(gps_file_name, json.encode(gps))
    return lat,lng
end

-- 从内存读取经度和维度
function utils._getLatLng()
    local lat, lng = 0, 0
    if utils.isFirstBoot() then
        log.info("第一次启动设备，获取GPS实时数据")
        lat, lng = utils._getRealLatLng()
    else
        local data = io.readFile(gps_file_name)
        local table_data = json.decode(data)
        lat = table_data['lat']
        lng = table_data['lng']
        log.info("获取缓存数据lat,lng", lat,lng)
    end
    return lat, lng
end

function utils.addLatLng(data)
    local lat, lng = utils._getLatLng()
    data['lat'] = lat
    data['lng'] = lng
    return data
end

local function _write2Global(table_data) 
    _G.mqtt_config = table_data['mqtt']
    _G.threshold = table_data['threshold']
    -- vbat读取数据为毫伏，配置文件为伏，故做转换
    _G.threshold['vbat'] = table_data['threshold']['vbat'] * 1000
    _G.interval = table_data['interval']
    for key, value in pairs(_G.interval) do
        -- 确保值是数字类型再进行计算
        if type(value) == "number" then
            _G.interval[key] = value * 1000 --将秒转换为毫秒
        end
    end
end

-- 读取json配置文件
local function loadConfig()
    -- 如果第一次启动，或者日期是10号或者20号的凌晨1点，从url读取配置文件，并更新，配置文件写入磁盘
    if utils.isFirstBoot() then    
        local ok, device_id = sys.waitUntil("net_ready")
        local url = config_download_url..'/'..device_id..'.json'
        local code, headers, body = http.request("GET", url).wait()
        if body then
            local table_data = json.decode(body)
            _write2Global(table_data)
            log.info("config file loaded by network: ", body)
            local writeSuccess = io.writeFile(config_file_name, body)
            if writeSuccess then
                log.info("写入配置文件成功")
            else
                log.error("写入配置文件失败")
                return
            end
        end
    end
    -- 最终都从配置文件读取
    local data = io.readFile(config_file_name)
    local table_data =  json.decode(data)
    _write2Global(table_data)
    log.info("config file loaded by harddisk file: ", data)
    sys.publish("CONFIG_READY")
end

function utils.table_len(t)
    local len = 0
    for _ in pairs(t) do
        len = len + 1
    end
    return len
end

function utils.psm()
    gpio.setup(20, nil, gpio.PULLDOWN) -- 休眠之前，压力传感器断电
    uart.setup(1, 9600) -- 配置uart1，外部唤醒用
    gpio.close(45) 
    gpio.close(46) --这里pwrkey接地才需要，不接地通过按键控制的不需要
    pm.dtimerStart(3, interval.report) -- 启动深度休眠定时器-单位毫秒
    mobile.flymode(0, true) -- 启动飞行模式，规避可能会出现的网络问题
    log.info("进入psm+模式")
    pm.power(pm.WORK_MODE, 3) -- 进入极致功耗模式
end


sys.taskInit(init)
sys.taskInit(loadConfig)

return utils
